iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
自我挑戰組

I don't know JS yet系列 第 26

[ Day 26 ] I don't know JS yet - 關於具名與匿名函式

  • 分享至 

  • xImage
  •  

今天份的學習,主要討論在寫程式時應不應該替函式命名,看完 Kyle 的觀點,認同他說的:每個函式都應該命名。

為什麼?
如果不能夠替函式命名,可能代表不清楚這個函式在做什麼,或是這個函式做太多事情了,或是...缺乏想像力;
沒有命名的函式,必須要看內容才能知道在做什麼,甚至還要在腦中跑一下這些程式碼;
命名的函式,從名字就知道在做什麼,讓其他開法者在看 codes 時,可以更快、更順暢(提高易讀性)。

內容參考:Scope & Closure apA

先看一下,匿名函式會造成在 debug 上增加難度

btn.addEventListener('click',function(){
    setTimeout(function(){
        ["temp",100].map(function(v){
            console.log(v.toUpperCase());
        });
    }, 100);
});
// Uncaught TypeError: v.toUpperCase is not a function
//     at myProgram.js:4
//     at Array.map (<anonymous>)
//     at myProgram.js:3

上面的 snippet 所有 callbacks 都是匿名函式,當有 error 時,只丟出第幾行有問題,不知道是哪個函式發生錯誤。

具名函式

具名的「名」有分成:explicitinferred

function thisIsNamed() {
    // ..
};

這個是 explicit name thisIsNamed

ajax("action.url", function thisIsAlsoNamed(){
    // ..
});

這個是 explicit name thisIsAlsoNamed

var notNamed = function(){
    // ..
};
// nah... notNamed, really?
console.log(notNamed.name); // notNamed

這個是 inferred name notNamed

var config = {
    cb /*also not a name*/: function(){
        // ..
    };
};
console.log(config.cb.name); // cb

這個是 inferred name cb

當匿名函式被當作 callback 傳進參數裡 ... sorry, no inferred name anymore

function ajax(url, cb) {
    console.log(cb.name);
}

ajax("action.url", function(){
    // ..
});

// ""

Line 5 的匿名函式當作 callback 傳進第二個參數,結果 name 屬性回傳 ""
通常 function expressions 會作為 callback 傳進參數裡,如果這個 callback 是匿名的,那它連 inferred name 也不會有。


Arrow Function

所有的 arrow function 都是匿名的,可能有 inferred name,但理論上都算匿名。
原文有聊到更多,連結在下面。


上一篇
[ Day 25 ] I don't know JS yet - arrow function scope
下一篇
[ Day 27 ] I don't know JS yet - Hoisting
系列文
I don't know JS yet30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言